iT邦幫忙

2022 iThome 鐵人賽

DAY 8
1
自我挑戰組

System Software Introduction系列 第 8

System Software - System Utilities Compiler Toolchain

  • 分享至 

  • xImage
  •  

System Utilities泛指幫助software developer進行開發、執行、除錯的工具,system utilities提供了build code/debug的功能,幫助software developer能得到可運行在CPU上的software,並且出錯時有工具協助debug


What is Compiler Toolchain

要讓C source code能夠跑在硬體的CPU上面,首先需要把C code轉換成CPU能看得懂的語言: machine code。一整套把C source code轉換成machine code的工具,就稱為compilation toolchain
Toolchain (工具鍊)是指前一項工具的輸出是後一項工具的輸入,以此串成了一個鍊。

示意圖: 一個compilation toolchain的"鍊"

https://ithelp.ithome.com.tw/upload/images/20220919/20152298sNxgGbT8Ez.jpg

https://ithelp.ithome.com.tw/upload/images/20220920/2015229801kDlTt6n0.jpg

Compiler Toolchain Tools and its Purposes

接著我們介紹要將C source code轉換成machine code需要經過哪些步驟、用到哪些tools、以及它們分別有什麼功能。

Automatic Build Tool

一個大型軟體專案當中,需要被編譯的source code數量非常多,這時候會面臨幾個問題

  1. 要對每一支source code都下指令編譯需要花很多時間與人力
  2. 因為不知道上一次編譯之後有哪幾支檔案被修改過,就算只改了部分檔案,為了確保正確性只好對全部的source code都重新編譯
  3. 編譯的選項設定、每一個執行檔需要的source code沒有中央控管機制,所有使用者要編譯的時候都要先閱讀編譯方法的文件才知道如何編譯
    所以編譯自動化的工具被發明出來協助這個流程
    例如: GNU make,這是一個可以接受makefile語法的描述檔案做編譯自動化的工具

Compiler

負責將C source code轉成assembly code的tool,在編譯過程中,主要的工作是對C source code做字彙分析 (Lexical Analysis)、語法分析 (Parsing)、語意分析 (Semantic analysis)、產生中間碼 (Intermedia code generation)、程式碼最佳化 (Optimization)、產生組合語言程式碼 (Code generation)六大步驟。

Assembler

負責將assembly code轉成object code (machine code)的tool,assembler產生出來的檔案為object file,其附檔名為.o/.obj。Assembler會挑選最短、最適合的machine code,才可以讓CPU有最高執行的效率 (指令size越小,同樣memory/cache size內就可以放更多指令,要執行的指令都在cache裡面,cache hit rate上升),常見的assembler: as (GNU assembler)。

Linker

一套軟體是可以由多支原始碼撰寫而成的,而這些原始碼是被分開編譯的,所以要有一套工具將這些原始碼的編譯結果 (object file) 組合起來。有一些linker支援link time optimization (LTO)的功能,因為linker看到的資料比compiler更廣更齊全,LTO能夠把沒有用到的資料、程式去除,或者再決定一次哪些function適合被inline等等最佳化。最常見的linker: ld (GNU linker)。


上一篇
System Software - System Library
下一篇
System Software - System Utilities Binutils
系列文
System Software Introduction30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言